﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Data.SqlClient;

namespace Clinica_Frba
{
    public partial class CompraBono : Form
    {
        Conexion sql = Conexion.getInstance();
        Utility util = Utility.getInstance();
        DateTime fechaActual;
        int idRolActual;
        decimal precioBoCo;
        decimal precioBoFa;
        decimal planMedico;
        bool validar = true;

        public CompraBono()
        {
            InitializeComponent();
        }

        private void CompraBono_Load(object sender, EventArgs e)
        {
            fechaActual = DateTime.ParseExact(util.getAppDate() + " " + util.getAppHora(), "yyyyMMdd HH:mm:ss", CultureInfo.InvariantCulture);
            idRolActual = util.getIdRol();
            itemsGrid.DataError +=new DataGridViewDataErrorEventHandler(itemsGrid_DataError);
            itemsGrid.CellEndEdit += new DataGridViewCellEventHandler(itemsGrid_CellEndEdit);

            if (idRolActual == 1) // es afiliado
            {
                loadAfiliado();
            }
            else // no es afiliado
            {
                loadAdmin();
            }

        }

        private void loadAfiliado()
        {
            try
            {
                SqlCommand query = new SqlCommand
                   ("select pa.Id_Paciente from b_sharp.Pacientes pa " +
                   "join b_sharp.usuarios u on u.id_usuario = pa.Usuario " +
                   "where u.id_usuario = @usuario;", sql.openCon());
                query.Parameters.AddWithValue("@usuario", util.getUserName());

                idAf.Text = Convert.ToString(query.ExecuteScalar());
                idAf.Enabled = false;

                if (verifAf())
                {
                    labelErrorAf.Visible = false;
                    loadGrid();
                }
                else
                {
                    labelErrorAf.Visible = true;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Error. Intente nuevamente.");
            }
        }


        private void loadAdmin()
        {
            foreach (Control control in this.Controls)
            {
                if (control.GetType().ToString() != "System.Windows.Forms.Label")
                {
                    control.Enabled = false;
                }
                idAf.Enabled = true;
                ingAf.Enabled = true;
                ingAf.Visible = true;
            }
            ingAf.Visible = true;
        }

        private void ingAf_Click(object sender, EventArgs e)
        {
            decimal idAfiliado;
            BuscarAfiliadoForm busquedaAfiliado = new BuscarAfiliadoForm();

            if (idAf.Text.Length == 0)
            { 
                idAfiliado = busquedaAfiliado.searchAfiliado();

                if (idAfiliado == -1)
                {
                    return;
                }

                idAf.Text = Convert.ToString(idAfiliado);
            }

            if (verifAf())
            {
                idAf.Enabled = false;
                labelErrorAf.Visible = false;
                ingAf.Visible = false;
                foreach (Control control in this.Controls)
                {
                    control.Enabled = true;
                }
                loadGrid();
                idAf.ReadOnly = true;
                PlanMed.ReadOnly = true;
            }
            else
            {
                labelErrorAf.Visible = true;
                return;
            }

        }

        private bool verifAf()
        {
            decimal numAf;
            if (decimal.TryParse(idAf.Text, out numAf))
            {
                try
                {

                    SqlCommand consulta = new SqlCommand
                       ("SELECT pa.Id_Paciente, pa.Plan_Med_Codigo, pa.Habilitado, pl.Plan_Med_Precio_Bono_Consulta, pl.Plan_Med_Precio_Bono_Farmacia, pl.Plan_Med_Descripcion " + 
                        "FROM b_sharp.Pacientes AS pa " +
                        "JOIN b_sharp.PlanMedico AS pl on pl.Plan_Med_Codigo = pa.Plan_Med_Codigo " +
                        "WHERE pa.Id_Paciente = @idPa;", sql.openCon());
                    consulta.Parameters.AddWithValue("@idPa", Convert.ToString(numAf));
                    SqlDataReader reader = consulta.ExecuteReader();
                    reader.Read();
                        if (reader.HasRows)
                        {
                            try
                            {
                                if (reader.GetString(2) != "N")
                                {
                                    planMedico = Convert.ToDecimal(reader.GetValue(1));
                                    precioBoCo = Convert.ToDecimal(reader.GetValue(3));
                                    precioBoFa = Convert.ToDecimal(reader.GetValue(4));
                                    PlanMed.Text = reader.GetString(5);
                                    reader.Close();
                                    return true;
                                }
                                else
                                {
                                    labelErrorAf.Text = "Número de Afiliado no encontrado";
                                    reader.Close();
                                    return false;
                                }
                            }
                            catch
                            {
                                MessageBox.Show("No hay datos");
                                return false;
                            }
                        }
                        else //no existe
                        {
                            labelErrorAf.Text = "Número de Afiliado no encontrado";
                            reader.Close();
                            return false;
                        }
                    
                }
                catch (SqlException)
                {
                    labelErrorAf.Text = "Error, intente nuevamente. Verifique los datos ingresados.";
                    return false;
                }
            }
            else
            {
                labelErrorAf.Text = "Ingrese un numero.";
                return false;
            }
        }

        private void loadGrid()
        {
            label2.Visible = true;
            PlanMed.Visible = true;
            DataGridViewRow newFila1 = new DataGridViewRow();
            DataGridViewRow newFila2 = new DataGridViewRow();
            DataGridViewRow newFila3 = new DataGridViewRow();

            itemsGrid.Rows.AddRange(new DataGridViewRow[] { newFila1, newFila2, newFila3 });
            newFila1.Cells[0].Value = "Bono Consulta";
            newFila2.Cells[0].Value = "Bono Farmacia";
            newFila3.HeaderCell.Value = "Total";

            newFila1.Cells[1].Value = fechaActual.ToShortDateString();
            newFila2.Cells[1].Value = fechaActual.ToShortDateString();

            newFila1.Cells[2].Value = "-------";
            newFila2.Cells[2].Value = (fechaActual.AddDays(60)).ToShortDateString();
            
            newFila1.Cells[3].ValueType = typeof(Int32);
            newFila2.Cells[3].ValueType = typeof(Int32);

            newFila1.Cells[3].Value = 0;
            newFila2.Cells[3].Value = 0;

            newFila3.ReadOnly = true;
        }

        public void itemsGrid_DataError(object sender, EventArgs e)
        {
            labelErrorGrid.Text = "Ingrese un número";
            labelErrorGrid.Visible = true;
        }

        void itemsGrid_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            labelErrorGrid.Visible = false;
            itemsGrid.Rows[0].Cells[4].Value = (precioBoCo * Convert.ToDecimal(itemsGrid.Rows[0].Cells[3].Value));
            itemsGrid.Rows[1].Cells[4].Value = (precioBoFa * Convert.ToDecimal(itemsGrid.Rows[1].Cells[3].Value));
            itemsGrid.Rows[2].Cells[4].Value = (Convert.ToDecimal(itemsGrid.Rows[0].Cells[4].Value) + Convert.ToDecimal(itemsGrid.Rows[1].Cells[4].Value));
        }

        private void buttonLimpiar_Click(object sender, EventArgs e)
        {
            itemsGrid.Rows[0].Cells[3].Value = 0;
            itemsGrid.Rows[1].Cells[3].Value = 0;
            itemsGrid.Rows[0].Cells[4].Value = 0;
            itemsGrid.Rows[1].Cells[4].Value = 0;
            itemsGrid.Rows[2].Cells[4].Value = 0;
            if (util.getIdRol() != 1)
            {
                idAf.Text = "";
                idAf.ReadOnly = false;
                PlanMed.Visible = false;
                label2.Visible = false;
                ingAf.Visible = true;
                itemsGrid.Enabled = false;
                buttonComp.Enabled = false;
                buttonLimpiar.Enabled = false;
                itemsGrid.Rows.Clear();
            }
            
            
        }

        private void buttonComp_Click(object sender, EventArgs e)
        {
            if ((Convert.ToInt32(itemsGrid[3, 0].Value) + Convert.ToInt32(itemsGrid[3, 1].Value)) > 0)
            {
                Decision decision = new Decision();
                decision.Text = "A comprar!";
                decision.label1.Text = "¿Desea realizar la compra?";
                decision.ShowDialog();
                if (decision.confirmar)
                {
                    comprar();
                }
            }
            else
            {
                MessageBox.Show("Ingrese cantidades");
            }
        }

        private void comprar()
        {
            int idCompra = obtenerIdCompra() + 1;

            try
            {
                insertarCompra(idCompra);
            }
            catch(Exception)
            {
                validar = false;
            }
            if (validar)
            {
                try
                {
                    for (int i = 0; i < Convert.ToInt32(itemsGrid.Rows[0].Cells[3].Value); i++)
                    {
                        insertarCompra_Bono(insertarBonoConsulta(), idCompra, "Bono Consulta", precioBoCo);
                    }
                    for (int i = 0; i < Convert.ToInt32(itemsGrid.Rows[1].Cells[3].Value); i++)
                    {
                        try
                        {
                            insertarCompra_Bono(insertarBonoFarmacia(), idCompra, "Bono Farmacia", precioBoFa);
                        }
                        catch(Exception)
                        {
                            validar = false;
                        }
                    }
                }
                catch (Exception)
                {
                    validar = false;
                }
            }

            if (validar)
            {
                MessageBox.Show("Compra realizada exitosamente.");
                buttonComp.Visible = false;
                buttonLimpiar.Visible = false;
                label2.Visible = true;
                //PlanMed.Text = Convert.ToString(planMedico);
                PlanMed.Visible = true;
                PlanMed.ReadOnly = true;
                buttonAceptar.Visible = true;
                itemsGrid.ReadOnly = true;
            }
            else
            {
                MessageBox.Show("Error en la compra, intente nuevamente");
                validar = true;
            }
        }

        private int obtenerIdCompra()
        {
            /*try
            {*/
                SqlCommand query = new SqlCommand
                           ("SELECT MAX(Id_Compra) FROM b_sharp.Compra;", sql.openCon());
                return Convert.ToInt32(query.ExecuteScalar());
           /* }
            catch (SqlException)
            {
                validar = false;
                MessageBox.Show("NOO SOY YOOO");
                return 0;
            }*/
        }

        private decimal insertarBonoConsulta()
        {
            decimal idConsulta = 0;
            /*try
            {*/
                SqlCommand query = new SqlCommand
                           ("SELECT MAX(BonoConsulta_Num) FROM b_sharp.BonoConsulta;", sql.openCon());

                idConsulta = Convert.ToDecimal(query.ExecuteScalar()) + 1;
                query.Dispose();

                query = new SqlCommand
                    ("INSERT INTO b_sharp.BonoConsulta " +
                     "(BonoConsulta_Num, Id_Paciente_Compra, PlanMed_Cod, Fecha_Compra)" +
                     "VALUES (@idCon, @idPa, @pMed, @fec);", sql.openCon());

                query.Parameters.AddWithValue("@idCon", idConsulta);
                query.Parameters.AddWithValue("@idPa", idAf.Text);
                query.Parameters.AddWithValue("@pMed", planMedico);
                query.Parameters.AddWithValue("@fec", fechaActual);
                query.ExecuteNonQuery();
                query.Dispose();

                return idConsulta;
            /*}
            catch (SqlException)
            {
                
                MessageBox.Show("SOY YO");
                return 0;
            }*/
        }

        private void insertarCompra_Bono(decimal idConsulta, int idCompra, string Tipo, decimal precio)
        {
            /*try
            {*/
                SqlCommand query = new SqlCommand
                    ("SET IDENTITY_INSERT b_sharp.Compra_Bono ON " +
                    "INSERT INTO b_sharp.Compra_Bono " +
	                "(Id_Compra, Num_Bono, Tipo_Bono, Id_Paciente, Fecha_Compra, Precio_Item) " +
	                "VALUES(@IdCom, @NumBon, @Tipo, @idPa, @Fec, @Precio) " +
	                "SET IDENTITY_INSERT b_sharp.Compra_Bono OFF;", sql.openCon());

                query.Parameters.AddWithValue("@IdCom", idCompra);
                query.Parameters.AddWithValue("@NumBon", idConsulta);
                query.Parameters.AddWithValue("@Tipo", Tipo);
                query.Parameters.AddWithValue("@idPa", idAf.Text);
                query.Parameters.AddWithValue("@Fec", fechaActual);
                query.Parameters.AddWithValue("@Precio", precio);
                query.ExecuteNonQuery();
                query.Dispose();

            /*}
            catch (SqlException)
            {
                MessageBox.Show("Error en la Compra de Bonos");
                validar = false;
            }*/
        }

        private decimal insertarBonoFarmacia()
        {
            decimal idFarmacia;
            /*try
            {*/
                SqlCommand query = new SqlCommand
                           ("SELECT MAX(BonoFarmacia_Num) FROM b_sharp.BonoFarmacia;", sql.openCon());

                idFarmacia = Convert.ToDecimal(query.ExecuteScalar()) + 1;
                query.Dispose();

                query = new SqlCommand
                    ("INSERT INTO b_sharp.BonoFarmacia " +
                     "(BonoFarmacia_Num, PlanMed_Cod, Id_Paciente_Compra, BonoFarmacia_FechaCompra, BonoFarmacia_FechaVencimiento)" +
                     "VALUES (@idFar, @pMed, @idPa, @Fec, @FecVen);", sql.openCon());

                query.Parameters.AddWithValue("@idFar", idFarmacia);
                query.Parameters.AddWithValue("@pMed", planMedico);
                query.Parameters.AddWithValue("@idPa", idAf.Text);
                query.Parameters.AddWithValue("@Fec", fechaActual);
                query.Parameters.AddWithValue("@FecVen", fechaActual.AddDays(60));
                query.ExecuteNonQuery();
                query.Dispose();
                return idFarmacia;
            /*}
            catch (SqlException)
            {
                MessageBox.Show("ACA ESTA EL LIO");
                return 0;
            }*/
        }

        private void insertarCompra(int idCompra)
        {
            int cantTot = 0;
            int precioFinal = Convert.ToInt32(itemsGrid.Rows[2].Cells[4].Value);

            for (int i = 0; i < 2; i++)
			{
			    cantTot += Convert.ToInt32(itemsGrid.Rows[i].Cells[3].Value);
			}

           /* try
            {*/
                SqlCommand query = new SqlCommand
                    ("insert into b_sharp.Compra " +
                    "values(@idCo, @idPa, @fec, @cantBo, @Prec);", sql.openCon());

                query.Parameters.AddWithValue("@IdCo", idCompra);
                query.Parameters.AddWithValue("@idPa", idAf.Text);
                query.Parameters.AddWithValue("@fec", fechaActual);
                query.Parameters.AddWithValue("@cantBo", cantTot);
                query.Parameters.AddWithValue("@Prec", precioFinal);
                query.ExecuteNonQuery();
                query.Dispose();

            /*}
            catch (SqlException)
            {
                MessageBox.Show("Error en la Compra.");
            }*/
        }

        private void buttonAceptar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    
    }
}
